//
// Created by lvyer on 2022/11/30.
//

// 1、动态注册 JNI函数
// 2、封装OpenGL工具类
// 3、着色器代码文件加载
// 4、C++实例保留（指针操作）
#include <jni.h>
#include <tools/LogTools.h>
#include <tools/JNITools.h>
#include <string>

#define NATIVE_JNI_CLASS_NAME "com/bytecodezz/dp/native/NativeController"


extern "C"
JNIEXPORT jstring JNICALL
nativeJNIVersion(JNIEnv *env, jclass jclz) {
    std::string versionStr = "version 1.0.0";
    return env->NewStringUTF(versionStr.c_str());
}

// {"方法名字符串","方法签名字符串",对应C层方法签名},
// {"native_Init","()V",(void *)(nativeJNIInit)} 表示java层的方法名叫 native_Init，无参数，void 返回值，对应c层的方法为 nativeJNIInit(...)
static JNINativeMethod dynamicJniMethods[] = {
        {"nativeVersion", "()Ljava/lang/String;", (void *) nativeJNIVersion}
};



// 加载lib库的时候首先被回调的方法
extern "C" jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    LOGDEBUG("JNI::JNI_OnLoad in");
    JNIEnv *env = nullptr;
    // 生成 jni环境变量
    if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR;
    }
    // 注册JNI函数
    jint regState = JNITools::registerNativeMethods(env, NATIVE_JNI_CLASS_NAME,
                                                    dynamicJniMethods,
                                                    sizeof(dynamicJniMethods) /
                                                    sizeof(dynamicJniMethods[0]));
    if (regState != JNI_TRUE) {
        return JNI_ERR;
    }
    LOGDEBUG("JNI::JNI_OnLoad out");
    return JNI_VERSION_1_6;
}

extern "C" void JNI_OnUnload(JavaVM *vm, void *reserved) {
    LOGDEBUG("JNI::JNI_OnUnload in");
    JNIEnv *env = nullptr;
    if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return;
    }
    LOGDEBUG("JNI::JNI_OnUnload out");
    // 注销 JNI函数
    JNITools::unRegisterNativeMethods(env, NATIVE_JNI_CLASS_NAME);
}